package E_2024;

import java.util.LinkedList;
import java.util.Objects;
import java.util.Queue;
import java.util.Stack;

public class E_100_7 {
    /*
    已知火星人使用的运算符为#、$，其与地球人的等价公式如下：
    x#y = 4*x+3*y+2
    x$y = 2*x+y+3
        1、其中x、y是无符号整数
        2、地球人公式按C语言规则计算
        3、火星人公式中，#的优先级高于$，相同的运算符，按从左到右的顺序计算
    现有一段火星人的字符串报文，请你来翻译并计算结果。
    输入描述
        火星人字符串表达式（结尾不带回车换行）
        输入的字符串说明：字符串为仅由无符号整数和操作符（#、$）组成的计算表达式。
        例如：123#4$5#67$78。
        用例保证字符串中，操作数与操作符之间没有任何分隔符。
        用例保证操作数取值范围为32位无符号整数。
        保证输入以及计算结果不会出现整型溢出。
        保证输入的字符串为合法的求值报文，例如：123#4$5#67$78
        保证不会出现非法的求值报文，例如类似这样字符串：
        #4$5 //缺少操作数
        4$5# //缺少操作数
        4#$5 //缺少操作数
     */
    public static void main(String[] args) {
        System.out.println(hxw1("123#4$5#67$78"));
    }
    public static String hxw1(String str){
        LinkedList<String> queue = new LinkedList<>();
        // 数字起始位
        int left = 0;
        boolean sh = false;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            // #符号直接将数值入队列，待命，同时数字初始位+1
            if (ch == '#'){
                sh = true;
                queue.add(str.substring(left,i));
                left = i+1;
            }else if ( ch == '$'){
                // 判断$符号前是否有#，有则需要先进行计算，无则直接将数字入队列
                int num1 = Integer.parseInt(str.substring(left, i));
                if (sh) {
                    sh = false;
                    int num2 = Integer.parseInt(queue.pollLast());
                    num1 = 4*num1+3*num2+2;
                }
                queue.add(String.valueOf(num1));
                left = i+1;
            }
        }
        queue.add(str.substring(left));
        System.out.println(queue);
        // 队列执行 $ 符号的运算
        while(queue.size() >= 2){
            int num1 = Integer.parseInt(queue.pollFirst());
            int num2 = Integer.parseInt(queue.pollFirst());
            queue.addFirst(String.valueOf(2*num1+num2+3));
        }
        return queue.pop();
    }
}
